package main

import (
	"fmt"
	"reflect"
)

/*===Type.Name() 与 Type.Kind()===
- 通过reflect.TypeOf()获取接口具体类型Type，通过具体类型即可获取这个类型的名称和底层数据结构
	- 自定义类型，有自己Name，自己的类型元数据main
	- 类型别名，Name和原始类型一样，并且使用原始类型的类型元数据
- Type.Name 即 类型的名称
- Type.kind 即 类型的底层结构，如各种数据类型、结构体(struct)、指针(ptr)
- reflect.TypeOf(v) 返回值是 Type,将runtime下的_type类型转换为reflect _rtype类型，rtype的作用类似Java中的Class对象(通过Class对象可以运行时获取对象的方法及属性)

- 注意：Go语言的反射中，基本类型，像int、数组、切片、Map、指针等类型的变量，它们的.Name()都是返回空。
*/
func main() {
	var a *float32 //指针
	var b myint    //自定义类型(拥有自己的类型元数据)
	var c rune     //类型别名(会关联到同一个类型元数据)
	reflectType(a) //type:  , kind: ptr
	reflectType(b) //type: myint , kind: struct
	reflectType(c) //type: int32 , kind: int32
	reflectType(5)

	var d = person{
		name: "彬",
		age:  18,
	}
	reflectType(d) //type: person , kind: struct
	var e = book{
		title: "小王子",
	}
	reflectType(e) //type: book , kind: struct
	var f []string
	reflectType(f) //type: book , kind: struct
}

type myint struct {
}
type person struct {
	name string
	age  int
}
type book struct {
	title string
}

func reflectType(x interface{}) {
	v := reflect.TypeOf(x)
	fmt.Printf("type: %v , kind: %v \n", v.Name(), v.Kind())
}
